package offer.offer01;

/**
 *
 */
public class S21调整数组顺序使奇数位于偶数前面 {
    /**
     * 用另一个数组重新排版一下这个数组应该就行了吧
     */
    public int[] exchange(int[] nums) {
        int numLen = nums.length;
        int[] outputNums = new int[numLen];
        int startLoc = 0, startLoc2 = numLen-1;
        for(int i : nums) {
            if(i%2 == 1) {
                outputNums[startLoc] = i;
                startLoc++;
            }else {
                outputNums[startLoc2] = i;
                startLoc2--;
            }
        }
        return outputNums;
    }

    /**
     * 3%2 = 1, -3 % 2 = -1, 3&1 = 1, -3&1 = 1; 所以说用&的方式来判断奇偶数要比使用%先进很多,
     * 他使用双指针来做交换; 使用交换确实可以免除一半的赋值操作, 使用双指针好一点, 尽可能减少对数据的修改
     */

    public int[] exchange2(int[] nums) {
        int head = 0;
        int tail = nums.length - 1;
        int temp;
        while (head < tail) {
            while ((nums[head] & 1) == 1 && (head < tail)) head++;
            while ((nums[tail] & 1) == 0 && (head < tail)) tail--;
            temp = nums[head];
            nums[head] = nums[tail];
            nums[tail] = temp;
        }
        return nums;
    }
}
